import tkinter as tk

# 堆排序相关函数
def tree(arr, n, i):

    father = i  # 父节点
    l_sub = i * 2 + 1  # 左子节点
    r_sub = i * 2 + 2  # 右子节点

    # 移除最大的节点
    if l_sub < n and arr[father] < arr[l_sub]:
        father = l_sub
    if r_sub < n and arr[father] < arr[r_sub]:
        father = r_sub

    # 交换较大的节点
    if father != i:
        arr[i], arr[father] = arr[father], arr[i]
        # 递归调整
        tree(arr, n, father)

def heap(arr):
    n = len(arr)
    # 生成完美二叉树（堆）
    for i in range(n // 2 - 1, -1, -1):
        tree(arr, n, i)

    # 反向取值
    for i in range(n - 1, 0, -1):
        # 最大的与最后面的换位置
        arr[0], arr[i] = arr[i], arr[0]
        tree(arr, i, 0)
    return arr

def send():
    try:
        # 获取输入框中的内容并分割成数组
        input_str = entry.get()
        # 转成整数或者浮点数
        arr = [int(x) for x in input_str.split()]

        # 进行堆排序
        sorted_arr = heap(arr)

        # 显示排序结果
        result_label.config(text=" ".join(map(str, sorted_arr)))
    except ValueError:
        result_label.config(text="请输入以空格分隔的数字")

# 创建主窗口
root = tk.Tk()
root.title("堆排序（二叉树排序）")

# 创建输入框
entry = tk.Entry(root, width=30)
entry.insert(0, "1 3 2 5 61 17 9")
entry.pack(pady=10)

# 创建排序按钮
tk.Button(root, text="堆排序", command=send).pack(pady=5)

# 创建结果标签
result_label = tk.Label(root, text="")
result_label.pack()

# 运行主循环
root.mainloop()